/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUIaVykreslovanie;

import java.awt.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeMap;
import javax.swing.JComponent;
import javax.swing.JOptionPane;

/**
 *  Komponent používateľského grafického rozhrania vykreslujúci a zobrazujúci
 *  rozvrh 
 * 
 * @author MartinaHlinková
 */
public class PlatnoRozvrh extends JComponent{
    /**
     * premenná, z ktorej sa čítajú všetky informácie z LubaEditoru
     */
    LubaEditor lubaEditor;
    
    /**
     * konštanta s výškou riadku označujúceho zamestnanca a jeho zmeny
     */
    public static final int MENO_POLE_VYSKA = 35;
    /**
     * konštanta s šírku bunky, vktorej je vypísané meno zamestnanca
     */
    public static final int MENO_POLE_SIRKA = 100;
    /**
     * konštanka s výškou prvého riadku tabľky, v ktorom sú označené dni (riadok dní)
     */
    public static final int DEN_POLE_VYSKA = 50;
    /**
     * konštanta so šírkou stĺpcov, v ktorých sú dni a zmeny v tých dňoch
     */
    public static final int DEN_POLE_SIRKA = 25;

    /**
     * Konštruktor triedy PlatnoRozvrh, ktorý má ako parameter objekt typu LubaEditor,
     * skadial berie potrebné informácie na správne rozvrazenie rozvrhu
     * 
     * @param novy objekt triedy LubaEditor, z ktorého získava informácie pre správne
     * vykreslenie rozvrhu
     */
	public PlatnoRozvrh(LubaEditor novy) {
		this.lubaEditor = novy;
	}

    @Override
    /**
     * Metóda vykreslujúca rozvrh LubaEditoru
     */
	public void paintComponent(Graphics g) 
        {
            if(this.lubaEditor == null || this.lubaEditor.getAktivnyProjekt() == null ||this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh() ==null){
                return;
            }
            Rozvrh.RozvrhMesiaca rozvrh = this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh();
            int pocetRiadkov = rozvrh.getInfo().pocetZamestnancov();
            int pocetStlpcov = rozvrh.getInfo().getPocetDni();
            int vyska = this.getHeight();
            int sirka = this.getWidth();
            Graphics2D gg = (Graphics2D) (g);
            

            
            // prvy riadok poradie dni
            //int sirkaStlpca = sirka/(pocetStlpcov+1);
            //int vyskaRiadku = vyska/(pocetRiadkov+1);
            
            int sirkaOkna = MENO_POLE_SIRKA+ (pocetStlpcov*DEN_POLE_SIRKA);
            int vyskaOkna = DEN_POLE_VYSKA + (pocetRiadkov*MENO_POLE_VYSKA);
            this.setPreferredSize(new Dimension(sirkaOkna, vyskaOkna));
          
            //prvy riadok s dnami
            for(int i = 1; i<= pocetStlpcov;i++){
                if(this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh().getInfo().getCharakterDni()[i-1] == InformacnaStruktura.CharakterDna.PRACOVNY){
                    gg.setColor(new Color(153,217,234));
                }else{
                    gg.setColor(new Color(0,162,234));
                }
                int xBod = MENO_POLE_SIRKA+(i-1)*DEN_POLE_SIRKA;
                
                 gg.fillRect(xBod, 0 , DEN_POLE_SIRKA, DEN_POLE_VYSKA);
                 gg.setColor(Color.BLACK);
                 gg.drawRect(xBod, 0 , DEN_POLE_SIRKA, DEN_POLE_VYSKA);
                 gg.drawString(""+i,xBod+(DEN_POLE_SIRKA/2),DEN_POLE_VYSKA/2);
            }
            
            //prvy stlpec mena zamestnancov
            
            for(int i = 0 ; i<this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh().getInfo().pocetZamestnancov();i++){
                int idZamestnanca = this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh().getRiadkyZamestnancov().get(i);
                
                int yBod = DEN_POLE_VYSKA+(i)*MENO_POLE_VYSKA;
                
                gg.setColor(Color.CYAN);
                gg.fillRect(0,yBod, MENO_POLE_SIRKA, MENO_POLE_VYSKA);
                gg.setColor(Color.BLACK);
                gg.drawRect(0,yBod, MENO_POLE_SIRKA, MENO_POLE_VYSKA);
                String meno = this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh().getInfo().getMnozinaZamestnancov().get(idZamestnanca).getPriezviskoZamestnanca();
                meno = ""+ meno;
                gg.drawString(meno, 2,yBod+(MENO_POLE_VYSKA/2));
            }
            //prazdna tabulka
            
	
           for(int j = 0;j<pocetStlpcov;j++){
                for(int k = 0; k< pocetRiadkov;k++){
                    Rozvrh.Zmeny zmena = this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh().getZmenaPodlaKoordinatov(j, k);
                    
                    int xBod = MENO_POLE_SIRKA + (j)*DEN_POLE_SIRKA;
                    int yBod = DEN_POLE_VYSKA + (k)*MENO_POLE_VYSKA;
                    
                    if(zmena ==null){
                        gg.setColor(Color.white);
                        gg.fillRect(xBod, yBod, DEN_POLE_SIRKA, MENO_POLE_VYSKA);
                        gg.setColor(Color.black);
                        gg.drawRect(xBod, yBod, DEN_POLE_SIRKA, MENO_POLE_VYSKA);
                        
                    }else{
                        InformacnaStruktura.TypZmeny typ = zmena.getTypZmeny();
                        switch(typ){
                            
                            case RANNA:{
                                    gg.setColor(new Color(225,225,102));
                                    break;
                                   }
                            case POOBEDNA:{
                                    gg.setColor(new Color(204,213,102));
                                    break;
                                    }
                            case NOCNA:{
                                    gg.setColor(new Color(153,170,102));
                                    break;
                                    }
                            case DENNA:{
                                    gg.setColor(new Color(102,255,102));
                                    break;
                                    }
                            case NOCNA_DLHA:{
                                    gg.setColor(new Color(0,128,0));
                                    break;
                                    }
                            case DOVOLENKA:{
                                    gg.setColor(new Color(153,213,255));
                                    break;
                                    }
                            case KUCHYNA:{
                                    gg.setColor(new Color(51,128,153));
                                    break;
                                    }
                            case NASTAVITELNA:{
                                gg.setColor(new Color(204,85,51));
                                break;
                            }
                            default:{
                                    gg.setColor(Color.white);
                                    break;
                                    }
                            
                         
                        }
                        gg.fillRect(xBod, yBod, DEN_POLE_SIRKA, MENO_POLE_VYSKA);
                        gg.setColor(Color.black);
                        gg.drawRect(xBod, yBod, DEN_POLE_SIRKA, MENO_POLE_VYSKA);
                        if(zmena != null){
                            if(typ == InformacnaStruktura.TypZmeny.NASTAVITELNA){
                                String casOd =zmena.getCasOd().toString();
                                String casDo =zmena.getCasDo().toString();
                                int vyskaR = gg.getFontMetrics().getHeight();
                                gg.drawString(casOd,xBod+2 , yBod+(MENO_POLE_VYSKA/2)-vyskaR/2+2);
                                gg.drawString(casDo,xBod+2 , yBod+(MENO_POLE_VYSKA/2)+vyskaR/2+2);
                            }else{
                                gg.drawString(""+zmena.getTypZmeny(),xBod+2 , yBod+(MENO_POLE_VYSKA/2));
                            }
                        }
                        
                    }
                }
            }
            
           //vycisenie napisov za tabulkou doprava
           if(sirka > sirkaOkna){
              gg.setColor(Color.LIGHT_GRAY);
              gg.fillRect(sirkaOkna+1, 0, sirka-sirkaOkna-1, vyska);
           }
           if(vyska > vyskaOkna){
               gg.setColor(Color.LIGHT_GRAY);
               gg.fillRect(0,vyskaOkna+1,sirka,vyska-vyskaOkna-1);
           }

	}
    
    /**
     * Metóda, ktorá podľa parametru bodu, kde bolo kliknuté prepne status dňa
     * z voľného na pracovný alebo opačne v rozvrhu, na ktorom sa práve pracuje. 
     * 
     * @param bod   bod označujúci, kde bolo kliknuté
     */
    public void prepniStatusDna(Point bod){
        Rozvrh.RozvrhMesiaca rozvrh = this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh();
        InformacnaStruktura.CharakterDna[] dni = this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh().getInfo().getCharakterDni();
        if(rozvrh == null || dni==null)return;
        int pocetStlpcov = rozvrh.getInfo().getPocetDni();
        
        int poziciaX = (int) (bod.x-MENO_POLE_SIRKA)/DEN_POLE_SIRKA;
        if(dni[poziciaX] == InformacnaStruktura.CharakterDna.PRACOVNY){
            dni[poziciaX] = InformacnaStruktura.CharakterDna.VOLNY;
        }else if(dni[poziciaX] == InformacnaStruktura.CharakterDna.VOLNY){
            dni[poziciaX] = InformacnaStruktura.CharakterDna.PRACOVNY;
        }
        TreeMap<Integer,Rozvrh.Zmeny[]> rozvrhZamestnancov = rozvrh.getRozvrh();
        for(Integer iterator: rozvrhZamestnancov.keySet()){
            rozvrhZamestnancov.get(iterator)[poziciaX] = null;
        }
        this.repaint();
    }
    
    /**
     * Metóda, ktorá zmení zmenu v rozvrhu podľa miesta, kde sa kliklo a typu zmeny,
     * ktorá bola nastavená na kurzore.
     * 
     * @param bod   bod označujúci, kde bolo kliknuté
     * @param zmena typ zmeny, ktorý bol nastavený na kurzore
     * @return hodnota typu boolean; ak sa úspešne zadelila zmena, tak true, 
     * pri akejkoľvek chybe false
     */
    public boolean zadelZmenu(Point bod, Rozvrh.Zmeny zmena){
        Rozvrh.RozvrhMesiaca rozvrh = this.lubaEditor.getAktivnyProjekt().getAktivnyRozvrh();
        if(rozvrh == null) return false;
        int pocetRiadkov = rozvrh.getInfo().pocetZamestnancov();
        int pocetStlpcov = rozvrh.getInfo().getPocetDni();
        
        Graphics2D gg = (Graphics2D) (super.getGraphics());
            
       
        int poziciaX = (int) (bod.x - MENO_POLE_SIRKA) /DEN_POLE_SIRKA;
        int poziciaY = (int) (bod.y - DEN_POLE_VYSKA)/MENO_POLE_VYSKA;
        if(rozvrh.nastavenieZmenyPodlaKoordinatov(poziciaX, poziciaY, zmena) == true){
            //this.repaint(new Ractangle);
            this.repaint();
            return true;
        }else{
            JOptionPane.showMessageDialog(this,"Tuto zmenu nemožno zadeliť.");
        }
        return false;
    }
    
    
}
